package cn.klaw.config;

import cn.klaw.constants.AiConstants;
import lombok.Data;

import java.util.List;

/**
 * AI 配置
 *
 *
 *
 * @date 2024/10/9 14:03
 */
@Data
public class AiProperties {

    /**
     * 是否启用
     */
    private boolean enabled;

    /**
     * openai服务器
     */
    private String apiHost = AiConstants.OPENAI_HOST;

    /**
     * openai key
     */
    private List<String> apiKey;

    /**
     * 超时时间
     */
    private Long timeout = 30L;

    /**
     * 代理配置
     */
    private Proxy proxy = new Proxy();

    /**
     * 对话配置
     */
    private ChatOption chat = new ChatOption();




    @Data
    public class ChatOption{

        /**
         * @see AiConstants.Model
         */
        private String mode = AiConstants.Model.QWEN_25_3;

        /**
         * 设置seed参数会使文本生成过程更具有确定性，通常用于使模型每次运行的结果一致。
         * 在每次模型调用时传入相同的seed值（由您指定），并保持其他参数不变，模型将很可能返回相同的结果。
         */
        private Integer seed = 1234;

        /**
         * 允许模型生成的最大Token数。
         */
        private Integer maxTokens = 1500;

        /**
         * 核采样的概率阈值，用于控制模型生成文本的多样性。
         * top_p越高，生成的文本更多样。反之，生成的文本更确定。
         * 由于temperature与top_p均可以控制生成文本的多样性，因此建议您只设置其中一个值。
         */
        private Double topP = 0.8;

        /**
         * 采样温度，用于控制模型生成文本的多样性。
         * temperature越高，生成的文本更多样，反之，生成的文本更确定。
         * 由于temperature与top_p均可以控制生成文本的多样性，因此建议您只设置其中一个值。
         */
        private Double temperature = 0.85;

        private boolean enableSearch = true;

    }


    @Data
    public class Proxy{
        /**
         * HTTP, SOCKS
         */
        private java.net.Proxy.Type type = java.net.Proxy.Type.HTTP;
        /**
         * 代理域名
         */
        private String host;
        /**
         * 代理端口
         */
        private Integer port;
        /**
         * 代理用户名
         */
        private String username;
        /**
         * 代理密码
         */
        private String password;
    }

}
